library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(sf)
## Linking to GEOS 3.9.1, GDAL 3.3.2, PROJ 7.2.1; sf_use_s2() is TRUE
library(leaflet)
## Warning: package 'leaflet' was built under R version 4.2.1
library(DT)
library(readr)
library(ggplot2)
library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✔ tibble  3.1.7     ✔ stringr 1.4.0
## ✔ tidyr   1.2.0     ✔ forcats 0.5.1
## ✔ purrr   0.3.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ plotly::filter() masks dplyr::filter(), stats::filter()
## ✖ dplyr::lag()     masks stats::lag()
library(terra)
## Warning: package 'terra' was built under R version 4.2.1
## terra 1.5.34
## 
## Attaching package: 'terra'
## The following object is masked from 'package:tidyr':
## 
##     extract
library(sf)
library(stringi)
library(readxl)
cantones <-
  st_read(dsn = "C:/Users/Bryan/OneDrive/Desktop/Procesamiento de Datos/Tarea3/cantones_simplificados.geojson", quiet = TRUE) %>%
  st_transform(4326)

# Transformación de datos de cantones
estadisticas_policiales <-
  readxl::read_excel (
    "C:/Users/Bryan/OneDrive/Desktop/Procesamiento de Datos/Tarea3/estadisticaspoliciales2021.xls"
  )

Mapa de cantones

# Lectura
cantones <-
  st_read(dsn = "C:/Users/Bryan/OneDrive/Desktop/Procesamiento de Datos/Tarea3/cantones_simplificados.geojson",
          quiet = TRUE) %>%
  st_transform(4326) # transformación a WGS84

# Transformación
cantones <-
  cantones %>%
  st_transform(5367) %>%
  st_simplify(dTolerance = 100) %>% # simplificación de geometrías
  st_transform(4326)
# En el data frame de cantones
cantones <-
  cantones %>%
  mutate(canton_normalizado = tolower(stri_trans_general(canton, id = "Latin-ASCII")))

delitos <-
  read_xls(path = "C:/Users/Bryan/OneDrive/Desktop/Procesamiento de Datos/Tarea3/estadisticaspoliciales2021.xls")

delitos <-
  delitos %>%
  mutate(canton_normalizado = tolower(stri_trans_general(Canton, id = "Latin-ASCII")))


delitos %>%
  left_join(
    dplyr::select(st_drop_geometry(cantones),
                  canton_normalizado, cod_canton),
    by = "canton_normalizado",
    copy = FALSE,
    keep = FALSE
  ) %>%
  filter(is.na(cod_canton) &
           canton_normalizado != "desconocido") %>% # los cod_canton = NA son los que no están en el data frame de cantones
  distinct(canton_normalizado)
## # A tibble: 2 × 1
##   canton_normalizado 
##   <chr>              
## 1 leon cortes        
## 2 vasquez de coronado
delitos <-
  delitos %>%
  mutate(Canton = if_else(Canton == "LEON CORTES", "LEON CORTES CASTRO", Canton)) %>%
  mutate(Canton = if_else(Canton == "VASQUEZ DE CORONADO", "VAZQUEZ DE CORONADO", Canton))

delitos <-
  delitos %>%
  mutate(canton_normalizado = tolower(stri_trans_general(Canton, id = "Latin-ASCII")))

delitos %>%
  left_join(
    dplyr::select(st_drop_geometry(cantones),
                  canton_normalizado, cod_canton),
    by = "canton_normalizado",
    copy = FALSE,
    keep = FALSE
  ) %>%
  filter(is.na(cod_canton) &
           canton_normalizado != "desconocido") %>% 
  distinct(canton_normalizado)
## # A tibble: 0 × 1
## # … with 1 variable: canton_normalizado <chr>
delitos <-
  delitos %>%
  left_join(
    dplyr::select(st_drop_geometry(cantones),
                  cod_canton,
                  canton_normalizado),
    by = "canton_normalizado",
    copy = FALSE,
    keep = FALSE
  )

delitos_x_canton <-
  delitos %>%
  count(cod_canton, name = "delitos")

cantones_delitos <-
  cantones %>%
  left_join(delitos_x_canton,
            by = "cod_canton",
            copy = FALSE,
            keep = FALSE)

colores_cantones_delitos <-
  colorNumeric(palette = "Blues",
               domain = cantones_delitos$delitos,
               na.color = "transparent")

leaflet() %>%
  setView(
    lng = -84.19452,
    lat = 9.572735,
    zoom = 7) %>%
  addTiles(group = "OpenStreetMap") %>% # capa base
  addPolygons(
    data = cantones_delitos,
    fillColor = ~ colores_cantones_delitos(cantones_delitos$delitos),
    fillOpacity = 0.8,
    color = "black",
    stroke = TRUE,
    weight = 1.0,
    popup = paste(
      paste("<strong>Cantón:</strong>",
            cantones_delitos$canton),
      paste("<strong>Delitos:</strong>",
            cantones_delitos$delitos),
      sep = '<br/>'
    ),
    group = "Delitos en cantones"
  ) %>%
  addLayersControl(
    baseGroups = c("OpenStreetMap"),
    overlayGroups = c("Delitos en cantones")
  ) %>%
  addLegend(
    position = "bottomleft",
    pal = colores_cantones_delitos,
    values = cantones_delitos$delitos,
    group = "Delitos",
    title = "Cantidad de delitos"
  )

Tabla

estadisticas_policiales <-
  readxl::read_excel (
    "C:/Users/Bryan/OneDrive/Desktop/Procesamiento de Datos/Tarea3/estadisticaspoliciales2021.xls"
  )

estadisticas_policiales <-
  estadisticas_policiales %>%
  select(Delito = Delito,
         Fecha,
         Victima,
         Edad,
         Genero = Genero,
         Provincia,
         Canton) %>%
  mutate(Fecha = as.Date(Fecha, format = "%d/%m/%Y"))

estadisticas_policiales %>%
  datatable(
    colnames = c(
      "Delito",
      "Fecha",
      "Victima",
      "Edad",
      "Genero",
      "Provincia",
      "Canton"
    ),
    options = list(
      pageLength = 5,
      language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json')
    )
  )
## Warning in instance$preRenderHook(instance): It seems your data is too big
## for client-side DataTables. You may consider server-side processing: https://
## rstudio.github.io/DT/server.html

Grafico de Delitos

ggplot2_barras_proporcion <-
  estadisticas_policiales %>%
  ggplot(aes(
    x = Delito,
    y = stat(count),
    group = 100
  )) +
  geom_bar() +
  ggtitle("Tipos de Delitos") +
  xlab("Delito") +
  ylab("Cantidad") +
  theme_minimal()

ggplotly(ggplot2_barras_proporcion) %>% config(locale = 'es')

Grafico por victima

delitos_tipo <-
  delitos %>%
  count(Victima) %>%
  ggplot(aes(x = reorder(Victima, n), y = n)) +
  geom_bar(stat = "identity") +
  ggtitle("Delitos por tipo") +
  xlab("Tipo de delito") +
  ylab("Victimas") +
  coord_flip()

delitos_tipo %>%
  ggplotly() %>%
  config(locale = 'es')

Grafico por mes

ggplot2_histograma_estadisticas_policiales <-
  estadisticas_policiales %>%
  ggplot(aes(x = Fecha)) +
  geom_histogram(binwidth = 80) +
  ggtitle("Delitos por Mes") +
  xlab("Fecha") +
  ylab("Cantidad de Delitos") +
  theme_minimal()

ggplotly(ggplot2_histograma_estadisticas_policiales) %>% config(locale = 'es')  

Grafico barras apiladas

ggplot2_barras_apiladas_cantidad <-
  estadisticas_policiales %>%
  ggplot(aes(x = Delito, fill = Genero)) +
  geom_bar(position = "fill") +
  ggtitle("Proporcion de delito por genero") +
  xlab("Delito") +
  ylab("Cantidad") +
  labs(fill = "Delito") +
  theme_minimal()

ggplotly(ggplot2_barras_apiladas_cantidad) %>% config(locale = 'es')